/**
 * 
 */
package com.gr.experimental.model;

import java.util.List;
import java.util.Map;

import com.gr.experimental.model.impl.ObjectCount;

/**
 * @author Karol Banczyk
 *
 */
public interface MTheoryManager {

	MTheory createMTheory(List<MFrag> mfrags, List<UID> uids, Map<String, UID> aliases);
	
	MFrag createMFrag(String name, List<Node> contextNodes, List<Node> inputNodes, List<ResidentNode> residentNodes);

	Node createNode(RVClass rvClass, List<? extends RVArgument> arguments);
	
	ResidentNode createResidentNode(
			RVClass rvClass, 
			Distribution distribution,
			List<? extends RVArgument> arguments
			);

	ResidentNode createResidentNode(
			RVClass rvClass, 
			Distribution distribution,
			List<? extends RVArgument> arguments,
			List<? extends Node> parents);
	
	RVClass createRVClass(String name, List<UID> domain, int argumentCount);

	RVClassInfluence createRVClassInfluence(RVClass rvClass, int[] counts);
	
	OVariable createOVariable(String name);
	
	UID createUID(String name);
	
	Distribution createConstDistribution(List<UID> domain, List<ObjectCount<RVClass>> parents, double[][] distrs, double[] defaultDistr);

	Distribution createConstDistribution(List<UID> domain, double[] defaultDistr);
	
	Distribution createDistribution(String type, String description);
	
	BuiltInElements getBuiltInElements();
	

}
